<template>
  <ExamPaper :items="paper" :name="title" @update:answers="val => (finalAnswers = val)" />
</template>

<script setup>
import { ref, onMounted, computed } from 'vue'
import ExamPaper from '@/components/ExamPaper.vue'
// 使用路由meta中的name作为标题
import { useRoute } from 'vue-router'
const route = useRoute()
const title = computed(() => {
  return route.meta.title || '算法题库'
})

const paper = ref([
  {
    question: `
    栈（简单）
    第1题 
    括号是否匹配
    给定一个只包括 
    '(', ')', '{', '}', '\[', '\]' 的字符串 s ，判断字符串是否有
    效。
    有效字符串需满足：
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    每个右括号都有一个对应的相同类型的左括号。
    输入描述
    输入包含一行，代表s
    输出描述
    true代表有效，
    示例1
    输入
    "()" 
    false代表无效
    输出
    true 
    示例2
    输入
    "()[]{}" 
    输出
    true 
    示例3
    输入
    "(]" 
    输出
    false
    `,
    answer: `
    function deal1(str) {
      const map = new Map([
        ['(',')'],
        ['{','}'],
        ['[',']'],
      ])
      const queue = [];
      const leftSet = new Set(['(','{','['])
      for(let i=0;i<str.length;i++){
        const chart = str[i];
        if(leftSet.has(chart)){
          queue.push(chart)
        }else{
          if(map.get(queue.pop())!=chart){
            return false
          }
        }
      }
      return true
    }
    `,
    remark: `

    `
  },
  {
    question: `
    第2题 
    无重复字符的最长字串
    给定一个字符串s，请你找出其中不含有重复字符的 
    输入描述
    输入包含一行，代表s
    输出描述
    true代表有效，
    示例1
    输入
    "abcabcbb" 
    false代表无效
    最长子串 的长度。
    输出
    3 
    说明
    因为无重复字符的最长子串是 "abc"，所以其长度为 3。 
    示例2
    输入
    "bbbbb" 
    输出
    1 
    说明
    因为无重复字符的最长子串是 "b"，所以其长度为 1。 
    示例3
    输入
    "pwwkew" 
    输出
    3 
    说明
    因为无重复字符的最长子串是 "wke"，所以其长度为 3。 
    请注意，你的答案必须是子串的长度，"pwke" 是一个子序列，不是子串。 
    `,
    answer: `
    function deal2(str) {
      const set = new Set();
      let maxLength = 0;
      for (let index = 0; index < str.length; index++) {
        const chart = str[index];
        if(set.has(chart)){
          if(set.size>maxLength){
            maxLength = set.size;
          }
          set.clear()
        }else{
          set.add(chart)
        }
      }
      return maxLength
    }
    `,
    remark: `

    `
  },
  {
    question: `
    第3题 
    最短路径和
    给定一个包含非负整数的 
    m x n 网格 
    grid ，请找出一条机器人从左上角到右下角的路
    径，使得路径上的数字总和为最小。
    说明：一个机器人每次只能向下或者向右移动一步。
    <img src="">
    输入描述
    输入grid二维数组，
    输出描述
    grid[i][j]代表
    从左上角到右下角最短路径和
    示例1
    输入
    1 3 1 
    1 5 1 
    4 2 1 
    (i, j)点的数字
    输出
    7  # 最短路径为： 1→3→1→1→1 总和最小 
    示例2
    输入
    1 2 3 
    4 5 6 
    输出
    12
    `,
    answer: `
    function deal3(grid) {
      const rowMax = grid.length
      const colMax = grid[0].length
      const list = []
      function step(row=0,col=0,num=0) {
        if(row==rowMax || col == colMax){
          return 
        }else{
          num+= grid[row][col]
          if((row == (rowMax-1) )&& (col == (colMax -1))){
            if(list[0]&&(num<list[0])){
              list.unshift(num)
            }else{
              list.push(num)
            }
          }
          step(row+1,col,num)
          step(row,col+1,num)
        }
      }
      step()
      return list[0]
    }
    `,
    remark: `
    这个题目其实可以更难一点如果是不止向下向右走
    那么就需要用到动态规划了，这个题目就是动态规划的一个简化版。
    如果可以随意走动。那么就需要把走过的路径记录下来
    然后每次走到一个点的时候，判断这个点是不是已经走过
    如果走过的话，就不用再走了。走无可走和走到终点中断。
    这个题目可以用回溯法来做。也就是push和pop用来记录路径和跳出递归后恢复路径
    `
  },
])

onMounted(() => {

})


const finalAnswers = ref([])   // 实时收集到的答案
</script>